; color computer vga adapter
; vg6 mode tools library
;
; *********************************************
; *   SETUP COCOVGA BOARD FOR VG6
; *  setupvga()
; *********************************************
FUNCTION	SETUPVGA	MODE,RGB
REM	; setupvga(mode,rgb)  mode=0 or 1=multi screens. rgb=1 cmp=0
REM	; make sure your code starts at $4000 as this uses two screens of 6k
DEF	MODE	BYTE
DEF	RGB	BYTE
MODE	FCB	0
RGB	FCB	0
PALRGB	FCB	0,56,63,2,16,18,8,9,32,36,28,27,42,53,52,54
PALCMP	FCB	0,32,63,3,17,34,12,28,6,22,30,61,9,37,21,36
SETUPVGA	LDD	$FFFE	;check if coco3
	ADDD	$FFFF
	CMPA	#167
	LBEQ	SETUPCC3
;	ORCC	#$50
;
	LDA	$FF02
	LDA	$FF03
	ANDA	#252
	ORA	#1
	STA	$FF03
	LDA	$FF02
;
IVGA	LDA	$FF03
	BPL	IVGA
	LDA	$FF02
; **********************************************
; * fiddle 512 byte *regs*
; **********************************************
	LDA	#$94	;enhanced/ARTIFACT COLS/extras 148
	STA	$401
	LDA	#$00
	STA	$400
	STA	$402
	STA	$403
	STA	$406
	STA	$407
	LDA	#$0B	
	STA	$405	;extras - border/STATUS OVERRIDE
	LDA	#$01	;vg6
	STA	$408
; colors
	LDD	#$8000	;black
	STD	$484	;border color
	STD	$440	;palette 0  (cc3=0)
	LDD	#$C210	
	STD	$442	;pallete 1  (cc3=56)
	LDD	#$E318
	STD	$444	;pallete 2  (cc3=63)
	LDD	#$8100
	STD	$446	;pallete 3  (cc3=2)
	LDD	#$8200
	STD	$448	;pallete 4  (cc3=16)
	LDD	#$8300
	STD	$44A	;pallete 5  (cc3=18)
	LDD	#$8010
	STD	$44C	;pallete 6  (cc3=8)
	LDD	#$8018
	STD	$44E	;pallete 7  (cc3=9)
	LDD	#$C000
	STD	$450	;pallete 8  (cc3=32)
	LDD	#$E000
	STD	$452	;pallete 9  (cc3=36)
	LDD	#$A210
	STD	$454	;pallete 10  (cc3=28)
	LDD	#$8318
	STD	$456	;pallete 11  (cc3=27)
	LDD	#$C110
	STD	$458	;pallete 12  (cc3=42)
	LDD	#$E208
	STD	$45A	;pallete 13  (cc3=skin)
	LDD	#$E200
	STD	$45C	;pallete 14  (cc3=52)
	LDD	#$E300
	STD	$45E	;pallete 15  (cc3=54)
; *
; **********************************************
; *
	LDA   	#$90  	SET COMBO LOCK 1
	STA  	$FF22  	WRITE TO PIA
	LDA   	#$48  	SET COMBO LOCK 2
	STA  	$FF22  	WRITE TO PIA
	LDA   	#$A0  	SET COMBO LOCK 3
	STA  	$FF22  	WRITE TO PIA
	LDA   	#$F8  	SET COMBO LOCK 4
	STA  	$FF22  	WRITE TO PIA
	LDA	#0
	STA	$FF22
WVS2	LDA	$FF03
	BPL	WVS2
	LDA	$FF02
	LDA	#$E0
	STA	$FF22	
	STA	$FFC3
	STA	$FFC5	;cg6
;	ANDCC	#$EF	;irq back
	LDA	MODE
	BNE	SET2
; setup sam at e00 edit $2600view
SET1	CLRA	;set value 7 so its at 3584 view
	LDX	#65478
	STA	1,X
	STA	3,X
	STA	5,X
	STA	6,X
	STA	8,X
	STA	10,X
	STA	12,X
	RTS
SET2	CLRA	;set value so its at 3584 edit 9728 view zone   lets try 19 =9728
	LDX	#65478
	STA	1,X
	STA	3,X
	STA	4,X
	STA	6,X
	STA	9,X
	STA	10,X
	STA	12,X
	RTS
; hopefully drawing at 3584 will show on screen
SETUPCC3	LDA	RGB
	BNE	SETRGB
	LDX	#PALCMP
	BRA	COLORSET
SETRGB	LDX	#PALRGB
; **********************************************
; * CC3 / MMU / SCS / 1616
; **********************************************
COLORSET	LDD	#$4C00	
	STD	$FF90	
; set palette
SETPAL	LDA	$FF03
	BPL	SETPAL
	LDA	$FF02
	LDU	#$FFB0
PALLP	LDD	,X++
	STD	,U++
	CMPU	#$FFC0
	BLO	PALLP
; **********************************************
; * 128 x 96 x 16 videomode + gime setup
; **********************************************
	LDD	#$8212	;$82 > $80 = gfx mode $02 = 2LPR
	STD	$FF98	;$12 > 64 bytes, 192 lines, 16 colors 
; **********************************************
; * screen offset at $60000
; *
; * physical address / 8192 = MMU PAGE
; *
; * mmu page * 1024 = offset address
; **********************************************
	LDD	#$C0C0	;$60000/$2000=$30 > $30*$400=$C000
	STD	$FF9D
; **********************************************
; * 8k of mmu bank(s) at $2000 
; **********************************************
	LDA	#$30	;setup MMU window (addressable screen)
	STA	$FFA1
	LDD	#0	;clear out 6k of screen
	LDX	#$2600
CLS	STD	,X++
	CMPX	#$3E00
	BLO	CLS
	RTS
ENDFUNCTION
;
; ************************************************************************************************************************
; * sync()
; ************************************************************************************************************************
FUNCTION	SYNCVGA	METHOD
REM	; syncvga(color) 0-15,  16=noclear 0-15 color clear select
REM	; 
DEF	METHOD	BYTE
METHOD	FCB	0,0
STACKS	FCB	0,0
SYNCVGA	LDA	METHOD
	CMPA	#16
	LBEQ	NOCLEAR
; clear begins
	LDA	METHOD
	LDB	#16
	MUL
	ADDB	METHOD
	STB	METHOD
	LDA	METHOD
	STD	METHOD	;now loaded as d
;	PSHS	CC,DP
	STS	STACKS	;save stack
	LDS	#$E00
	LDU	#$2606
LOOP2	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	12,U
	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	12,U
	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	12,U
	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	12,U
	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	12,U
	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	12,U
	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	12,U
	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	12,U
	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	12,U
	PULS	X,Y,D
	PSHU	D,Y,X
	LEAU	10,U
	PULS	X,Y
	PSHU	Y,X
	LEAU	10,U
	CMPS	#$2600
	BLO	LOOP2
	LDS	STACKS	;return stack
	LDU	#$2600
	LDD	METHOD
	LDX	METHOD
	LDY	METHOD
CLS2	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	X,Y,D
	PSHU	D
	CMPU	#$E00
	BHI	CLS2
	RTS
; done exit
NOCLEAR	LDX	#$E00
	LDU	#$2600
LOOP1	LDD	,X
	STD	,U
	LDD	2,X
	STD	2,U
	LDD	4,X
	STD	4,U
	LDD	6,X
	STD	6,U
	LDD	8,X
	STD	8,U
	LDD	10,X
	STD	10,U
	LDD	12,X
	STD	12,U
	LDD	14,X
	STD	14,U
	LDD	16,X
	STD	16,U
	LDD	18,X
	STD	18,U
	LDD	20,X
	STD	20,U
	LDD	22,X
	STD	22,U
	LDD	24,X
	STD	24,U
	LDD	26,X
	STD	26,U
	LDD	28,X
	STD	28,U
	LDD	30,X
	STD	30,U
	LEAU	32,U
	LEAX	32,X
	CMPX	#$2600
	BLO	LOOP1
	RTS
ENDFUNCTION
;
*
; ************************************************************************************************************************
; * cls()
; ************************************************************************************************************************
FUNCTION	CLS	COL
REM	; cls(color) 0-15
REM	; vga screen clear
DEF	COL	BYTE
COL	FCB	0,0
CLS	LDA	COL
	CMPA	#16
	BHS	EXIT1
	BRA	NOEX
EXIT1	RTS
NOEX	LDA	COL
	LDB	#16
	MUL
	ADDB	COL
	STB	COL
	LDA	COL
	STD	COL	;now loaded as d
	LDX	#$E00
	LDU	COL
LOOP2	STU	,X
	STU	2,X
	STU	4,X
	STU	6,X
	STU	8,X
	STU	10,X
	STU	12,X
	STU	14,X
	STU	16,X
	STU	18,X
	STU	20,X
	STU	22,X
	STU	24,X
	STU	26,X
	STU	28,X
	STU	30,X
	LEAX	32,X
	CMPX	#$2600
	BLO	LOOP2
	RTS
ENDFUNCTION
;
; **********************************************************************************************************
; * box code start
; **********************************************************************************************************
FUNCTION	BOX	X1,Y1,X2,Y2,COL1,COL2,FILL
REM	; box(x1,y1,x2,y2,color 1, fill color, fill) 0-127,0-96 color0-15 fill=1 nofill=0
REM	; 
DEF	X1	BYTE
DEF	X2	BYTE
DEF	Y1	BYTE
DEF	Y2	BYTE
DEF	COL1	BYTE
DEF	COL2	BYTE
DEF	FILL	BYTE
X1	FCB	0
X2	FCB	0
HALFX1	FCB	0
HALFX2	FCB	0
Y1	FCB	0
Y2	FCB	0
COL1	FCB	5
COL2	FCB	9
FILL	FCB	1,0
DOT1	FCB	0
DOT2	FCB	0
ODD1	FCB	0
ODD2	FCB	0
CNTY	FCB	0
CNTX	FCB	0
HALFDX	FCB	0
X3	FCB	0
BOX	LDX	#$E00
	LDA	X1
;	CMPA	#128
;	BHS	EXIT1
	BMI	EXIT1
	CMPA	X2
	BHI	EXIT1	;x2 is lower then x1 ...no go
	LDA	Y1
	CMPA	#96
	BHS	EXIT1
	CMPA	Y2
	BHI	EXIT1	;y2 is lower then y1 ...no go
	LDA	X2
;	CMPA	#128
;	BHS	EXIT1
	BMI	EXIT1
	LDA	Y2
	CMPA	#96
	BHS	EXIT1
	BRA	GCHECK1
EXIT1	RTS	;no go
; GCHECK1	LDA	X1
;	LSRA
;	INCA
;	STA	HALFX1
;	LDA	X2
;	LSRA
;	SUBA	#2
;	STA	HALFX2
;	SUBA	HALFX1
;	STA	HALFDX	;distance saved
; simon code
GCHECK1	LDD	X1
	LSRA
	LSRB
	INCA
	SUBB	#2
	STD	HALFX1
	SUBB	HALFX1
	STB	HALFDX
; simon code
	LDA	FILL
	LBEQ	NOFILL2
; lets do the fill first
	LDA	COL2
	LDB	#16
	MUL
	ADDB	COL2
	STB	FILL
	LDA	FILL
	STD	FILL	;double now
; color fill set
	LDA	Y1
	INCA	; lets increase this so we dont draw same line twice
	STA	CNTY
	LDB	#64
	MUL
	LEAX	D,X	;line y should be correct
	LDB	HALFX1
	ABX
; ok im hoping this works
	LDU	FILL	;u has color
YLOOPF	LDA	HALFX1
	STA	CNTX
XLOOPF	STU	,X+
	INC	CNTX
	LDA	CNTX
	CMPA	HALFX2
	BLS	XLOOPF	;continue
	LDA	#63
	SUBA	HALFDX
	LEAX	A,X	;hopefully that worked
;
	INC	CNTY
	LDA	CNTY
	CMPA	Y2
	BHS	NOFILL	;lets exit to draw outer lines
	BRA	YLOOPF
; end y loop
NOFILL	LDX	#$E00	;top line
	LDA	Y1
	LDB	#64
	MUL
	LEAX	D,X
	LDB	HALFX1
	ABX
	LDY	#$E00	;bot line
	LDA	Y2
	LDB	#64
	MUL
	LEAY	D,Y
	LDB	HALFX1
	LEAY	B,Y
; ok both should be set
; lets run the lines the new col
	LDA	COL1
	LDB	#16
	MUL
	ADDB	COL1
	STB	FILL
	LDA	FILL
	STD	FILL	;fill is now d with outline color col1=preserved
; ok lets do the top lines
	LDU	FILL	;u has color
	LDA	HALFX1
	STA	CNTX
XLOOPO	STU	,X+
	STU	,Y+
	INC	CNTX
	LDA	CNTX
	CMPA	HALFX2
	BLS	XLOOPO	;continue
; ok now we need last two lines
; is x1 odd?
	LDA	X1
	BITA	#1
	BNE	NOTODD1
	CLR	ODD1
	BRA	ODDSCH2
NOTODD1	LDA	#1
	STA	ODD1
ODDSCH2	LDA	X2
	BITA	#1
	BNE	NOTODD2
	CLR	ODD2
	BRA	ODDSDN
NOTODD2	LDA	#1
	STA	ODD2
; ok both odds figured out
ODDSDN	LDX	#$E00
	LDY	#$E00
	LDA	Y1
	LDB	#64
	MUL
	LEAX	D,X
	LEAY	D,Y
	LDB	X1
	LSRB
	ABX
	LEAY	B,Y
	LDA	X2
	SUBA	X1
; try
	LSRA
	LEAY	A,Y
	LDA	ODD2
	BNE	NOWAY
	LEAY	1,Y
; both set
NOWAY	LDA	Y1
	STA	CNTY
YLOOPZ	LDA	ODD1
	BNE	COL_BOTH
; ok we need first dot from screen
	LDA	COL1
	STA	DOT1
	LDA	COL2
	STA	DOT2
; check for top
	LDA	CNTY
	CMPA	Y1
	BEQ	FIXDOT1
	CMPA	Y2
	BEQ	FIXDOT1
	BRA	LOOKY
FIXDOT1	LDA	COL1
	STA	DOT2
	BRA	LOOKY
COL_BOTH	LDA	,X
	LSRA
	LSRA
	LSRA
	LSRA
	STA	DOT1
	LDA	COL1
	STA	DOT2
LOOKY	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,X
; ok now y
	LDA	ODD2
	BNE	COL_BOTH2
; ok we need first dot from screen
	LDA	,Y
	ORA	#240
	SUBA	#240
	STA	DOT2
	LDA	COL1
	STA	DOT1
	BRA	LOOKY2
COL_BOTH2	LDA	COL1
	STA	DOT2
	LDA	COL2
	STA	DOT1
; do a top and bot check on y
	LDA	CNTY
	CMPA	Y1
	BEQ	FIXDOT2
	CMPA	Y2
	BEQ	FIXDOT2
	BRA	LOOKY2
FIXDOT2	LDA	COL1
	STA	DOT1
LOOKY2	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,Y
	LEAX	64,X
	LEAY	64,Y
	INC	CNTY
	LDA	CNTY
	CMPA	Y2
	LBLS	YLOOPZ	;lets exit to draw outer lines
	RTS
; end y loop
;
;
;
;
;
;
;
NOFILL2	LDX	#$E00	;top line
	LDA	Y1
	LDB	#64
	MUL
	LEAX	D,X
	LDB	HALFX1
	ABX
	LDY	#$E00	;bot line
	LDA	Y2
	LDB	#64
	MUL
	LEAY	D,Y
	LDB	HALFX1
	LEAY	B,Y
; ok both should be set
; lets run the lines the new col
	LDA	COL1
	LDB	#16
	MUL
	ADDB	COL1
	STB	FILL
	LDA	FILL
	STD	FILL	;fill is now d with outline color col1=preserved
; ok lets do the top lines
	LDU	FILL	;u has color
	LDA	HALFX1
	STA	CNTX
XLOOP_O	STU	,X+
	STU	,Y+
	INC	CNTX
	LDA	CNTX
	CMPA	HALFX2
	BLS	XLOOP_O	;continue
; ok now we need last two lines
; is x1 odd?
	LDA	X1
	BITA	#1
	BNE	NOTODD_1
	CLR	ODD1
	BRA	ODDSCH_2
NOTODD_1	LDA	#1
	STA	ODD1
ODDSCH_2	LDA	X2
	BITA	#1
	BNE	NOTODD_2
	CLR	ODD2
	BRA	ODDSD_N
NOTODD_2	LDA	#1
	STA	ODD2
; ok both odds figured out
ODDSD_N	LDX	#$E00
	LDY	#$E00
	LDA	Y1
	LDB	#64
	MUL
	LEAX	D,X
	LEAY	D,Y
	LDB	X1
	LSRB
	ABX
	LEAY	B,Y
	LDA	X2
	SUBA	X1
; try
	LSRA
	LEAY	A,Y
	LDA	ODD2
	BNE	NOWAY2
	LEAY	1,Y
; both set
NOWAY2	LDA	Y1
	STA	CNTY
YLOOP_Z	LDA	ODD1
	BNE	COL_BOTH4
; ok we need first dot from screen
	LDA	COL1
	STA	DOT1
; fix
	LDA	,X
	ORA	#240
	SUBA	#240
	STA	DOT2
; check for top
	LDA	CNTY
	CMPA	Y1
	BEQ	FIXDOT_1
	CMPA	Y2
	BEQ	FIXDOT_1
	BRA	LOOK_Y
FIXDOT_1	LDA	COL1
	STA	DOT2
	BRA	LOOK_Y
COL_BOTH4	LDA	,X
	LSRA
	LSRA
	LSRA
	LSRA
	STA	DOT1
	LDA	COL1
	STA	DOT2
LOOK_Y	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,X
; ok now y
	LDA	ODD2
	BNE	COL_BOTH5
; ok we need first dot from screen
	LDA	,Y
	ORA	#240
	SUBA	#240
	STA	DOT2
	LDA	COL1
	STA	DOT1
	BRA	LOOKY_2
COL_BOTH5	LDA	COL1
	STA	DOT2
; fix
	LDA	,Y
	LSRA
	LSRA
	LSRA
	LSRA
	STA	DOT1
; do a top and bot check on y
	LDA	CNTY
	CMPA	Y1
	BEQ	FIXDOT_2
	CMPA	Y2
	BEQ	FIXDOT_2
	BRA	LOOKY_2
FIXDOT_2	LDA	COL1
	STA	DOT1
LOOKY_2	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,Y
	LEAX	64,X
	LEAY	64,Y
	INC	CNTY
	LDA	CNTY
	CMPA	Y2
	LBLS	YLOOP_Z
	RTS
ENDFUNCTION
;
; **************************************************************************************************************
; * print(disp,posx,posy,color,transparency,start,len,text$)
; **************************************************************************************************************
FUNCTION	PRINT	DISP,CX,CY,CC,CT,START,LEN,Y
REM	; print( displaymode, posx, posy, color, transparency, start, length, [text pointer] or "TEXT STRING")
REM	; yay
DEF	DISP	BYTE
DEF	CX	BYTE
DEF	CY	BYTE
DEF	CC	BYTE
DEF	CT	BYTE
DEF	START	BYTE
DEF	LEN	BYTE
DEF	Y	STRING
#NOMOVE
ASCII32	FCB	0,0,0,0,0,0,0,0	;32
	FCB	0,24,24,24,0,0,24,0	;33
	FCB	0,40,40,0,0,0,0,0	;34
	FCB	0,40,124,40,124,40,0,0	;35
	FCB	20,62,96,62,2,126,20,0	;36
	FCB	0,98,100,8,16,38,70,0	;37
	FCB	24,36,36,24,42,68,58,0	;38
	FCB	0,24,24,0,0,0,0,0	;39
	FCB	0,24,48,48,48,48,24,0	;40
	FCB	0,24,12,12,12,12,24,0	;41
	FCB	0,24,60,24,36,0,0,0	;42
	FCB	0,8,8,62,8,8,0,0	;43
	FCB	0,0,0,0,0,0,24,48	;44
	FCB	0,0,0,60,0,0,0,0	;45
	FCB	0,0,0,0,0,0,24,24	;46
	FCB	0,2,6,12,24,48,96,0	;47
	FCB	0,60,102,98,98,102,60,0	;48
	FCB	0,24,56,56,24,24,126,0	;49
	FCB	0,60,98,2,28,112,126,0	;50
	FCB	0,60,98,2,14,98,60,0	;51
	FCB	0,100,100,126,12,12,12,0	;52
	FCB	0,62,96,124,2,98,124,0	;53
	FCB	0,62,96,124,98,98,60,0	;54
	FCB	0,126,6,12,24,24,24,0	;55
	FCB	0,60,98,60,98,98,60,0	;56
	FCB	0,60,98,98,62,6,6,0	;57
	FCB	0,24,24,0,0,24,24,0	;58
	FCB	0,24,24,0,0,0,24,48	;59
	FCB	0,12,24,48,96,48,24,12	;60
	FCB	0,0,60,0,0,60,0,0	;61
	FCB	0,48,24,12,6,12,24,48	;62
	FCB	0,60,98,2,28,24,0,24	;63
	FCB	0,60,98,106,110,96,62,0	;64
	FCB	0,60,118,98,126,98,98,0	;65
	FCB	0,124,98,124,98,98,124,0	;66
	FCB	0,60,98,96,96,98,60,0	;67
	FCB	0,124,98,98,98,98,124,0	;68
	FCB	0,126,96,120,96,96,126,0	;69
	FCB	0,126,96,120,96,96,96,0	;70
	FCB	0,126,98,96,110,98,126,0	;71
	FCB	0,98,98,126,98,98,98,0	;72
	FCB	0,126,24,24,24,24,126,0	;73
	FCB	0,126,8,8,104,104,120,0	;74
	FCB	0,98,100,120,120,100,98,0	;75
	FCB	0,96,96,96,96,96,126,0	;76
	FCB	0,98,118,126,126,106,98,0	;77
	FCB	0,98,114,122,110,102,98,0	;78
	FCB	0,60,98,98,98,98,60,0	;79
	FCB	0,124,98,98,124,96,96,0	;80
	FCB	0,60,98,98,106,102,62,1	;81
	FCB	0,124,98,98,124,98,98,0	;82
	FCB	0,60,98,112,12,98,60,0	;83
	FCB	0,126,24,24,24,24,24,0	;84
	FCB	0,98,98,98,98,98,126,0	;85
	FCB	0,98,98,98,52,60,24,0	;86
	FCB	0,98,98,106,126,118,98,0	;87
	FCB	0,98,52,24,24,52,98,0	;88
	FCB	0,98,118,60,24,24,24,0	;89
	FCB	0,126,100,8,16,98,126,0	;90
	FCB	0,30,24,24,24,24,30,0	;91
	FCB	0,64,96,48,24,12,6,0	;92
	FCB	0,120,24,24,24,24,120,0	;93
	FCB	0,24,24,52,98,0,0,0	;94
	FCB	0,0,0,0,0,0,0,126	;95
	FCB	0,24,56,48,0,0,0,0	;96
	FCB	0,102,153,129,66,36,24,0	;97 extended graphic using lowercase
	FCB	0,102,255,255,126,60,24,0	;98
	FCB	0,0,0,63,48,48,48,63	;99
	FCB	0,0,0,255,0,0,0,255	;100
	FCB	0,0,0,252,68,84,68,252	;101
	FCB	48,48,63,48,63,0,0,0	;102
	FCB	0,0,255,0,255,0,0,0	;103
	FCB	12,12,252,12,252,0,0,0	;104
	FCB	48,48,48,48,48,48,48,48	;105
	FCB	12,12,12,12,12,12,12,12	;106
	FCB	127,213,213,221,201,201,255,255	;107
	FCB	254,186,34,186,10,186,254,252	;108
	FCB	127,201,205,207,203,201,255,255	;109
	FCB	254,114,82,82,82,114,254,252	;110
	FCB	48,48,63,48,63,48,48,48	;111
	FCB	12,12,252,12,252,12,12,12	;112
	FCB	0,0,127,128,128,127,0,0	;113
	FCB	0,0,254,1,1,254,0,0	;114
	FCB	24,102,66,129,129,66,102,24	;115
	FCB	24,126,102,195,195,102,126,24	;116
	FCB	24,126,126,231,231,126,126,24	;117
	FCB	24,126,126,255,255,126,126,24	;118
	FCB	0,0,0,28,24,20,2,0	;119
	FCB	16,16,0,198,0,16,16,0	;120
	FCB	255,129,129,129,129,129,129,255	;121
	FCB	255,255,255,255,255,255,255,255	;122 lower case z slot
#MOVE
CX	FCB	0	;x 0-119 limitation
CY	FCB	10	;y 0-87 limitation
CT	FCB	1	;transparency
CC	FCB	7	;color
DOT1	FCB	0
DOT2	FCB	0
DOT3	FCB	0
DOT4	FCB	0
DOT5	FCB	0
DOT6	FCB	0
DOT7	FCB	0
DOT8	FCB	0
CNTR	FCB	0
CNT2	FCB	0	;len counter
LEN	FCB	0	;length
START	FCB	0	;text start
DISP	FCB	0	;what display? 0 or 1
; x=screen y=text u=ascii
PRINT	CLR	CNT2	;len counter
	LDA	START
	LEAY	A,Y	;y should be set already
; text in position
	LDA	DISP
	BNE	SETOS
	LDX	#$E00
	BRA	SETST
SETOS	LDX	#$2600
SETST	LDA	CX
	CMPA	#119
	BLS	LP0
	RTS	;outa range
LP0	LDA	CY
	CMPA	#87
	BLS	LP01
	RTS	;outa range
; calc screen
LP01	LDA	CY
	LDB	#64
	MUL
	LEAX	D,X
	LDB	CX
	LSRB
	ABX
; screen is ready
LP1	INC	CNT2
	LDA	CNT2
	CMPA	LEN
	BHI	DONES	;done string
	LDA	,Y+
; process this ascii code
	BNE	MS1
DONES	RTS	;done string
MS1	CMPA	#32
	BLO	ADJUSTHF
	SUBA	#32
	BRA	LPP2
; make adjustment here if any
ADJUSTHF	ADDA	#32
LPP2	LDU	#ASCII32
	LDB	#8
	MUL
	LEAU	D,U
; should be there
;
	CLR	CNTR
MAIN	INC	CNTR
	LDA	CNTR
	CMPA	#9
	BLO	MAIN2
; need to fetch next chr
	LEAX	-508,X	;hopefully right?
	BRA	LP1
;
MAIN2	LDA	,U+
	BITA	#128
	LBNE	LPD1
	CLR	DOT1
	LDB	CT
	BEQ	RPD1	;not transparent
	LDB	,X
	LSRB
	LSRB
	LSRB
	LSRB
	STB	DOT1	;saved background dot
RPD1	BITA	#64
	LBNE	LPD2
	CLR	DOT2
	LDB	CT
	BEQ	RPD2	;not transparent
	LDB	,X
	ORB	#240
	SUBB	#240
	STB	DOT2	;save background dot
RPD2	BITA	#32
	LBNE	LPD3
	CLR	DOT3
	LDB	CT
	BEQ	RPD3	;not transparent
	LDB	1,X
	LSRB
	LSRB
	LSRB
	LSRB
	STB	DOT3	;saved
RPD3	BITA	#16
	LBNE	LPD4
	CLR	DOT4
	LDB	CT
	BEQ	RPD4
	LDB	1,X
	ORB	#240
	SUBB	#240
	STB	DOT4	;saved
RPD4	BITA	#8
	LBNE	LPD5
	CLR	DOT5
	LDB	CT
	BEQ	RPD5
	LDB	2,X
	LSRB
	LSRB
	LSRB
	LSRB
	STB	DOT5	;saved
RPD5	BITA	#4
	LBNE	LPD6
	CLR	DOT6
	LDB	CT
	BEQ	RPD6
	LDB	2,X
	ORB	#240
	SUBB	#240
	STB	DOT6	;saved
RPD6	BITA	#2
	LBNE	LPD7
	CLR	DOT7
	LDB	CT
	BEQ	RPD7
	LDB	3,X
	LSRB
	LSRB
	LSRB
	LSRB
	STB	DOT7	;saved
RPD7	BITA	#1
	LBNE	LPD8
	CLR	DOT8
	LDB	CT
	BEQ	LP3
	LDB	3,X
	ORB	#240
	SUBB	#240
	STB	DOT8	;saved
RPD8	BRA	LP3
LPD1	LDB	CC
	STB	DOT1
	LBRA	RPD1
LPD2	LDB	CC
	STB	DOT2
	LBRA	RPD2
LPD3	LDB	CC
	STB	DOT3
	LBRA	RPD3
LPD4	LDB	CC
	STB	DOT4
	LBRA	RPD4
LPD5	LDB	CC
	STB	DOT5
	LBRA	RPD5
LPD6	LDB	CC
	STB	DOT6
	LBRA	RPD6
LPD7	LDB	CC
	STB	DOT7
	LBRA	RPD7
LPD8	LDB	CC
	STB	DOT8
; ok we set the dots hopefully
LP3	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,X
	LDA	DOT3
	LDB	#16
	MUL
	ADDB	DOT4
	STB	1,X
	LDA	DOT5
	LDB	#16
	MUL
	ADDB	DOT6
	STB	2,X
	LDA	DOT7
	LDB	#16
	MUL
	ADDB	DOT8
	STB	3,X
	LEAX	64,X	;next line
	LBRA	MAIN
ENDFUNCTION
;
; *************************************************************************************************************************
; * set(x,y,c)
; *************************************************************************************************************************
FUNCTION	SET	X1,Y1,SETCOL
REM	; set(x,y,color)  x=0-127 0-95 color 0-15
REM	; Does not push to stack
DEF	X1	BYTE
DEF	Y1	BYTE
DEF	SETCOL	BYTE
ODD	FCB	0
DOT1	FCB	0
DOT2	FCB	0
X1	FCB	0
Y1	FCB	0
SETCOL	FCB	0
SET	CLR	ODD
	LDA	X1
	CMPA	#127
	BLS	XOK
	RTS
XOK	LDA	Y1
	CMPA	#95
	BLS	YOK
	RTS
YOK	LDX	#$E00
	LDB	#64
	MUL
	LEAX	D,X
	LDB	X1
	BITB	#1
	BNE	NOTODD
	INC	ODD
NOTODD	LSRB
	LEAX	B,X	
; ok x is ready to draw dots
; lets grab what we have
	LDA	,X
	ORA	#240
	SUBA	#240
	STA	DOT2
	LDA	,X
	LSRA
	LSRA
	LSRA
	LSRA
	STA	DOT1
	LDA	SETCOL
	LDB	ODD
	BEQ	SECOND
; first dot draw
	STA	DOT1
	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,X
	RTS
SECOND	STA	DOT2
	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,X
	RTS
ENDFUNCTION
;
*
*
*
; **********************************************************************************************************************
; * plot(sin_costable,x1,y1,dx,dy,angle)
; * 
; **********************************************************************************************************************
FUNCTION	PLOT	SINTB1,PLOTX,PLOTY,RADX,RADY,ANGLE
REM	; plot([sintbl pointer],x1,y1,diamx,diamy,angle) max rad 34 circle angle 0-255 as percentage of 360
REM	; Does not push to stack uses X for sine table
DEF	SINTB1	WORD
DEF	ANGLE	BYTE
DEF	PLOTX	BYTE
DEF	PLOTY	BYTE
DEF	RADX	BYTE
DEF	RADY	BYTE
ANGLE	FCB	0
RADX	FCB	0	;radius
RADY	FCB	0
PLOTX	FCB	0
PLOTY	FCB	0
SINTB1	FCB	0,0
COSTB1	FCB	0,0
X1	FCB	0
Y1	FCB	0
;
PLOT	LDX	SINTB1
	LDB	ANGLE	;rotation
	ABX
	STX	SINTB1
	LDB	#64
	ABX
	STX	COSTB1
	LDX	SINTB1
	LDB	,X
	LDA	RADX
	MUL
	ASLB
	ROLA
	SUBA	RADX
	ADDA	PLOTX
	STA	X1
;cos
	LDX	COSTB1
	LDB	,X
	LDA	RADY
	MUL
	ASLB
	ROLA
	SUBA	RADY
	ADDA	PLOTY
	STA	Y1
	LDD	X1
;	LDB	Y1
	RTS
ENDFUNCTION
;
*
; **********************************************************************************************************************
; * plot3d(sin_costable,x1,y1,dx,dy,angle)
; * 
; **********************************************************************************************************************
FUNCTION	PLOT3D	SINTB1,PLOTX,PLOTY,RADX,RADY,ANGLE
REM	; plot3d([sintbl pointer],x1,y1,diamx,diamy,angle) max rad 34 circle angle 0-255 as percentage of 360
REM	; Does not push to stack uses X for sine table
DEF	SINTB1	WORD
DEF	ANGLE	BYTE
DEF	PLOTX	BYTE
DEF	PLOTY	BYTE
DEF	RADX	BYTE
DEF	RADY	BYTE
ANGLE	FCB	0
RADX	FCB	0	;radius
RADY	FCB	0
PLOTX	FCB	0
PLOTY	FCB	0
SINTB1	FCB	0,0
COSTB1	FCB	0,0
X1	FCB	0
Y1	FCB	0
;
PLOT3D	LDX	SINTB1
	LDB	ANGLE	;rotation
	ABX
	STX	SINTB1
	LDD	#577
	LEAX	D,X
	STX	COSTB1
	LDX	SINTB1
	LDB	,X
	LDA	RADX
	MUL
	ASLB
	ROLA
	SUBA	RADX
	ADDA	PLOTX
	STA	X1
;cos
	LDX	COSTB1
	LDB	,X
	LDA	RADY
	MUL
	ASLB
	ROLA
	SUBA	RADY
	ADDA	PLOTY
	STA	Y1
	LDA	X1
	LDB	Y1
	RTS
ENDFUNCTION
;
; **********************************************************************************************************************
; * circle(sin_costable,x1,y1,dx,dy,angle,dist,color)
; * 
; **********************************************************************************************************************
FUNCTION	CIRCLE	SINTB1,PLOTX,PLOTY,RADX,RADY,ANGLE,DIST,SETCOL
REM	; circle([sintbl pointer],x1,y1,diamx,diamy,angle,dist,col) max rad 34 dist=0-254 full circle angle 0-254 as percentage of 360
REM	; Does not push to stack uses X for sine table
DEF	SINTB1	WORD
DEF	ANGLE	BYTE
DEF	DIST	BYTE
DEF	PLOTX	BYTE
DEF	PLOTY	BYTE
DEF	RADX	BYTE
DEF	RADY	BYTE
DEF	SETCOL	BYTE
DIST	FCB	0
ANGLE	FCB	0
SETCOL	FCB	0
RADX	FCB	0	;radius
RADY	FCB	0
PLOTX	FCB	0
PLOTY	FCB	0
CNT	FCB	0	;counter from 0-255 to make circle
SINTB1	FCB	0,0
COSTB1	FCB	0,0
; dot reference
ODD	FCB	0
DOT1	FCB	0
DOT2	FCB	0
X1	FCB	0
Y1	FCB	0
TMPCOL	FCB	0
;
XX1	FCB	0
YY1	FCB	0
XX2	FCB	0
YY2	FCB	0
XXD	FCB	0
YYD	FCB	0
XXC	FCB	0
YYC	FCB	0
LWN	FCB	0
LCNT	FCB	0
;
CIRCLE	LDX	SINTB1
	LDB	ANGLE	;rotation
	ABX
	STX	SINTB1
	LDB	#64
	ABX
	STX	COSTB1
	CLR	CNT	;counter set
LOOP	LDX	SINTB1
	LDB	CNT
	ABX
	LDB	,X
	LDA	RADX
	MUL
	ASLB
	ROLA
	SUBA	RADX
	ADDA	PLOTX
	STA	X1
;cos
	LDB	CNT
	LDX	COSTB1
	ABX
	LDB	,X
	LDA	RADY
	MUL
	ASLB
	ROLA
	SUBA	RADY
	ADDA	PLOTY
	STA	Y1
NOFILL	JSR	SET
	LDA	CNT
	CMPA	DIST
	BEQ	EXITC
	INCA
	STA	CNT
	BRA	LOOP
EXITC	RTS
;
SET	CLR	ODD
	LDA	X1
	CMPA	#127
	BLS	XOK
	RTS
XOK	LDA	Y1
	CMPA	#95
	BLS	YOK
	RTS
YOK	LDX	#$E00
	LDB	#64
	MUL
	LEAX	D,X
	LDB	X1
	BITB	#1
	BNE	NOTODD
	INC	ODD
NOTODD	LSRB
	LEAX	B,X	
; ok x is ready to draw dots
; lets grab what we have
	LDA	,X
	ORA	#240
	SUBA	#240
	STA	DOT2
	LDA	,X
	LSRA
	LSRA
	LSRA
	LSRA
	STA	DOT1
	LDA	SETCOL
	LDB	ODD
	BEQ	SECOND
; first dot draw
	STA	DOT1
	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,X
	RTS
SECOND	STA	DOT2
	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,X
	RTS
;
ENDFUNCTION
;
; ***************************************************************************************************************
; *   line(x1,y1,x2,y2,color)   sg mode
; ***************************************************************************************************************
FUNCTION	LINE	X1,Y1,X2,Y2,SETCOL
REM	; line(x1,y1,x2,y2,col)  color 0-8
REM	; Does not push to stack
DEF	X1	BYTE
DEF	Y1	BYTE
DEF	X2	BYTE
DEF	Y2	BYTE
DEF	SETCOL	BYTE
SETCOL	FCB	0
DOT1	FCB	0
DOT2	FCB	0
X1	FCB	0
Y1	FCB	0
X2	FCB	0
Y2	FCB	0
XD	FCB	0
YD	FCB	0
XC	FCB	0
YC	FCB	0
WN	FCB	0
CNT	FCB	0
SETX	FCB	0
SETY	FCB	0
ODD	FCB	0
;
LINE	LDA	X1	;ok no swapping just get distances
	CMPA	X2
	BLS	LINS1	;if x1 is lower
	SUBA	X2	;its greater so sub x2
	STA	XD	;save x distance
	BRA	LINS2
LINS1	LDA	X2
	SUBA	X1
	STA	XD
;
LINS2	LDA	Y1	;ok now lets look at y
	CMPA	Y2
	BLS	LINS3	;y1 is lower?
	SUBA	Y2
	STA	YD	;save y distance
	BRA	LINS4
LINS3	LDA	Y2
	SUBA	Y1
	STA	YD
;
;which is greater?
LINS4	LDA	YD
	CMPA	XD
	BLO	LINS5	;y is lower then goto lins5
	STA	WN	;x is lower so save y as whole fraction
	BRA	LINS6	;done
LINS5	LDA	XD	;nope y is lower so save x as whole fraction
	STA	WN	;stored it
; ok now the main loop
LINS6	CLRA
	STA	XC	;x counter
	STA	YC	;y counter
	LDA	WN
	STA	CNT	;set counter
	INC	CNT
;ok check what display
;
LINE22	LDD	X1	;main loop
;	STA	SETX
;	LDA	Y1
;	STB	SETY
	JSR	SET	;jump to draw dot
	LDA	XC
	ADDA	XD	;add distance to xc counter
	CMPA	WN	;has it gone over or same as our whole fraction?
	BHS	ADV2	;it has on x.... lets advance it
	STA	XC	;nope keep counting 
	BRA	CHK2	;lets check y now
;
ADV2	SUBA	WN	;advance the x counter....subtract the whole fraction
	STA	XC	;store remainder to play with next loop
	LDA	X1
	CMPA	X2
	BHI	ADVX2
	INC	X1	;increase y plot or dec?
	BRA	CHK2
ADVX2	DEC	X1
CHK2	LDA	YC	;now the y axis.... loader up
	ADDA	YD	;add its distance
	CMPA	WN	;has it gone over or the same as our whole fraction
	BHS	ADVY2	;it has on y.... lets advance it
	STA	YC	;nope... keep counting
	BRA	CHKX2	;done
;advance it
ADVY2	SUBA	WN	;subtract the whole number from y counter
	STA	YC	;store the remainder for next loop
	LDA	Y1
	CMPA	Y2
	BHI	ADY2
	INC	Y1	;increase y plot or dec?
	BRA	CHKX2
ADY2	DEC	Y1
;done?
CHKX2	DEC	CNT	;check the counter
	BNE	LINE22	;nope keep plotting the line
	RTS	;we are done
;
SET	CLR	ODD
	LDA	X1
	CMPA	#127
	BLS	XOK
	RTS
XOK	LDA	Y1
	CMPA	#95
	BLS	YOK
	RTS
YOK	LDX	#$E00
	LDB	#64
	MUL
	LEAX	D,X
	LDB	X1
	BITB	#1
	BNE	NOTODD
	INC	ODD
NOTODD	LSRB
	LEAX	B,X	
; ok x is ready to draw dots
; lets grab what we have
	LDA	,X
	ORA	#240
	SUBA	#240
	STA	DOT2
	LDA	,X
	LSRA
	LSRA
	LSRA
	LSRA
	STA	DOT1
	LDA	SETCOL
	LDB	ODD
	BEQ	SECOND
; first dot draw
	STA	DOT1
	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,X
	RTS
SECOND	STA	DOT2
	LDA	DOT1
	LDB	#16
	MUL
	ADDB	DOT2
	STB	,X
	RTS
ENDFUNCTION
;
